/*************************************************************
* Strip Packing Problem
* 
*
* */
#ifndef TABU_H
#define TABU_H

#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <vector>
#include <map>

#include "rectangulo.h"
#include "contenedor.h"
#include "heuristica.h"
#include "solucion.h"

#define N_INIT_SOL 100
#define TABU_TIME 3
   
using namespace std;

class Tabu : public Heuristica {
private:
	// vector <<i, j>, rotacion<i, j>>
	vector <pair <pair<int, int>, pair<bool, bool> > > tabuList;

	// vector [i, j][rotacion]
	// rotacion:
	//	0 = false, false;
	//	1 = false, true;
	//	2 = true, false;
	//	3 = true, true;
	vector <vector <vector<int> > > tabuTable;

	Contenedor C;

public:
	Tabu(list<Rectangulo> lista_in, Contenedor C_);
         
	~Tabu();

	virtual list<Rectangulo> generaInicial();

	virtual list<Rectangulo> mejoraSolucion();

private:
	multimap <int , pair <pair <int, int>, pair <bool, bool> > > calcularCostos(vector <Rectangulo>& temp);

	void updateTabuList();
};

#endif
